<?php
// 中文转拼音 必须是gbk
//$M_zh2py =  new M_zh2py();
//echo $M_zh2py->encode('阿里巴巴科技有限公司');
namespace App\Library;

class MZh2py
{
    /**
     * 拼音字符转换图
     * @var array
     */
    private $_aMaps = array(
        'a'      => -20319, 'ai'    => -20317, 'an'    => -20304, 'ang'   => -20295, 'ao'    => -20292, 'ba'     => -20283, 'bai'   => -20265,
        'ban'    => -20257, 'bang'  => -20242, 'bao'   => -20230, 'bei'   => -20051, 'ben'   => -20036, 'beng'   => -20032, 'bi'    => -20026,
        'bian'   => -20002, 'biao'  => -19990, 'bie'   => -19986, 'bin'   => -19982, 'bing'  => -19976, 'bo'     => -19805, 'bu'    => -19784,
        'ca'     => -19775, 'cai'   => -19774, 'can'   => -19763, 'cang'  => -19756, 'cao'   => -19751, 'ce'     => -19746, 'ceng'  => -19741,
        'cha'    => -19739, 'chai'  => -19728, 'chan'  => -19725, 'chang' => -19715, 'chao'  => -19540, 'che'    => -19531, 'chen'  => -19525,
        'cheng'  => -19515, 'chi'   => -19500, 'chong' => -19484, 'chou'  => -19479, 'chu'   => -19467, 'chuai'  => -19289, 'chuan' => -19288,
        'chuang' => -19281, 'chui'  => -19275, 'chun'  => -19270, 'chuo'  => -19263, 'ci'    => -19261, 'cong'   => -19249, 'cou'   => -19243,
        'cu'     => -19242, 'cuan'  => -19238, 'cui'   => -19235, 'cun'   => -19227, 'cuo'   => -19224, 'da'     => -19218, 'dai'   => -19212,
        'dan'    => -19038, 'dang'  => -19023, 'dao'   => -19018, 'de'    => -19006, 'deng'  => -19003, 'di'     => -18996, 'dian'  => -18977,
        'diao'   => -18961, 'die'   => -18952, 'ding'  => -18783, 'diu'   => -18774, 'dong'  => -18773, 'dou'    => -18763, 'du'    => -18756,
        'duan'   => -18741, 'dui'   => -18735, 'dun'   => -18731, 'duo'   => -18722, 'e'     => -18710, 'en'     => -18697, 'er'    => -18696,
        'fa'     => -18526, 'fan'   => -18518, 'fang'  => -18501, 'fei'   => -18490, 'fen'   => -18478, 'feng'   => -18463, 'fo'    => -18448,
        'fou'    => -18447, 'fu'    => -18446, 'ga'    => -18239, 'gai'   => -18237, 'gan'   => -18231, 'gang'   => -18220, 'gao'   => -18211,
        'ge'     => -18201, 'gei'   => -18184, 'gen'   => -18183, 'geng'  => -18181, 'gong'  => -18012, 'gou'    => -17997, 'gu'    => -17988,
        'gua'    => -17970, 'guai'  => -17964, 'guan'  => -17961, 'guang' => -17950, 'gui'   => -17947, 'gun'    => -17931, 'guo'   => -17928,
        'ha'     => -17922, 'hai'   => -17759, 'han'   => -17752, 'hang'  => -17733, 'hao'   => -17730, 'he'     => -17721, 'hei'   => -17703,
        'hen'    => -17701, 'heng'  => -17697, 'hong'  => -17692, 'hou'   => -17683, 'hu'    => -17676, 'hua'    => -17496, 'huai'  => -17487,
        'huan'   => -17482, 'huang' => -17468, 'hui'   => -17454, 'hun'   => -17433, 'huo'   => -17427, 'ji'     => -17417, 'jia'   => -17202,
        'jian'   => -17185, 'jiang' => -16983, 'jiao'  => -16970, 'jie'   => -16942, 'jin'   => -16915, 'jing'   => -16733,
        'jiong'  => -16708, 'jiu'   => -16706, 'ju'    => -16689, 'juan'  => -16664, 'jue'   => -16657, 'jun'    => -16647, 'ka'    => -16474,
        'kai'    => -16470, 'kan'   => -16465, 'kang'  => -16459, 'kao'   => -16452, 'ke'    => -16448, 'ken'    => -16433, 'keng'  => -16429,
        'kong'   => -16427, 'kou'   => -16423, 'ku'    => -16419, 'kua'   => -16412, 'kuai'  => -16407, 'kuan'   => -16403, 'kuang' => -16401,
        'kui'    => -16393, 'kun'   => -16220, 'kuo'   => -16216, 'la'    => -16212, 'lai'   => -16205, 'lan'    => -16202, 'lang'  => -16187,
        'lao'    => -16180, 'le'    => -16171, 'lei'   => -16169, 'leng'  => -16158, 'li'    => -16155, 'lia'    => -15959, 'lian'  => -15958,
        'liang'  => -15944, 'liao'  => -15933, 'lie'   => -15920, 'lin'   => -15915, 'ling'  => -15903, 'liu'    => -15889, 'long'  => -15878,
        'lou'    => -15707, 'lu'    => -15701, 'lv'    => -15681, 'luan'  => -15667, 'lue'   => -15661, 'lun'    => -15659, 'luo'   => -15652,
        'ma'     => -15640, 'mai'   => -15631, 'man'   => -15625, 'mang'  => -15454, 'mao'   => -15448, 'me'     => -15436, 'mei'   => -15435,
        'men'    => -15419, 'meng'  => -15416, 'mi'    => -15408, 'mian'  => -15394, 'miao'  => -15385, 'mie'    => -15377, 'min'   => -15375,
        'ming'   => -15369, 'miu'   => -15363, 'mo'    => -15362, 'mou'   => -15183, 'mu'    => -15180, 'na'     => -15165, 'nai'   => -15158,
        'nan'    => -15153, 'nang'  => -15150, 'nao'   => -15149, 'ne'    => -15144, 'nei'   => -15143, 'nen'    => -15141, 'neng'  => -15140,
        'ni'     => -15139, 'nian'  => -15128, 'niang' => -15121, 'niao'  => -15119, 'nie'   => -15117, 'nin'    => -15110, 'ning'  => -15109,
        'niu'    => -14941, 'nong'  => -14937, 'nu'    => -14933, 'nv'    => -14930, 'nuan'  => -14929, 'nue'    => -14928, 'nuo'   => -14926,
        'o'      => -14922, 'ou'    => -14921, 'pa'    => -14914, 'pai'   => -14908, 'pan'   => -14902, 'pang'   => -14894, 'pao'   => -14889,
        'pei'    => -14882, 'pen'   => -14873, 'peng'  => -14871, 'pi'    => -14857, 'pian'  => -14678, 'piao'   => -14674, 'pie'   => -14670,
        'pin'    => -14668, 'ping'  => -14663, 'po'    => -14654, 'pu'    => -14645, 'qi'    => -14630, 'qia'    => -14594, 'qian'  => -14429,
        'qiang'  => -14407, 'qiao'  => -14399, 'qie'   => -14384, 'qin'   => -14379, 'qing'  => -14368, 'qiong'  => -14355, 'qiu'   => -14353,
        'qu'     => -14345, 'quan'  => -14170, 'que'   => -14159, 'qun'   => -14151, 'ran'   => -14149, 'rang'   => -14145, 'rao'   => -14140,
        're'     => -14137, 'ren'   => -14135, 'reng'  => -14125, 'ri'    => -14123, 'rong'  => -14122, 'rou'    => -14112, 'ru'    => -14109,
        'ruan'   => -14099, 'rui'   => -14097, 'run'   => -14094, 'ruo'   => -14092, 'sa'    => -14090, 'sai'    => -14087, 'san'   => -14083,
        'sang'   => -13917, 'sao'   => -13914, 'se'    => -13910, 'sen'   => -13907, 'seng'  => -13906, 'sha'    => -13905, 'shai'  => -13896,
        'shan'   => -13894, 'shang' => -13878, 'shao'  => -13870, 'she'   => -13859, 'shen'  => -13847, 'sheng'  => -13831, 'shi'   => -13658,
        'shou'   => -13611, 'shu'   => -13601, 'shua'  => -13406, 'shuai' => -13404, 'shuan' => -13400, 'shuang' => -13398,
        'shui'   => -13395, 'shun'  => -13391, 'shuo'  => -13387, 'si'    => -13383, 'song'  => -13367, 'sou'    => -13359,
        'su'     => -13356, 'suan'  => -13343, 'sui'   => -13340, 'sun'   => -13329, 'suo'   => -13326, 'ta'     => -13318, 'tai'   => -13147,
        'tan'    => -13138, 'tang'  => -13120, 'tao'   => -13107, 'te'    => -13096, 'teng'  => -13095, 'ti'     => -13091, 'tian'  => -13076,
        'tiao'   => -13068, 'tie'   => -13063, 'ting'  => -13060, 'tong'  => -12888, 'tou'   => -12875, 'tu'     => -12871,
        'tuan'   => -12860, 'tui'   => -12858, 'tun'   => -12852, 'tuo'   => -12849, 'wa'    => -12838, 'wai'    => -12831, 'wan'   => -12829,
        'wang'   => -12812, 'wei'   => -12802, 'wen'   => -12607, 'weng'  => -12597, 'wo'    => -12594, 'wu'     => -12585, 'xi'    => -12556,
        'xia'    => -12359, 'xian'  => -12346, 'xiang' => -12320, 'xiao'  => -12300, 'xie'   => -12120, 'xin'    => -12099,
        'xing'   => -12089, 'xiong' => -12074, 'xiu'   => -12067, 'xu'    => -12058, 'xuan'  => -12039, 'xue'    => -11867,
        'xun'    => -11861, 'ya'    => -11847, 'yan'   => -11831, 'yang'  => -11798, 'yao'   => -11781, 'ye'     => -11604, 'yi'    => -11589,
        'yin'    => -11536, 'ying'  => -11358, 'yo'    => -11340, 'yong'  => -11339, 'you'   => -11324, 'yu'     => -11303, 'yuan'  => -11097,
        'yue'    => -11077, 'yun'   => -11067, 'za'    => -11055, 'zai'   => -11052, 'zan'   => -11045, 'zang'   => -11041, 'zao'   => -11038,
        'ze'     => -11024, 'zei'   => -11020, 'zen'   => -11019, 'zeng'  => -11018, 'zha'   => -11014, 'zhai'   => -10838, 'zhan'  => -10832,
        'zhang'  => -10815, 'zhao'  => -10800, 'zhe'   => -10790, 'zhen'  => -10780, 'zheng' => -10764, 'zhi'    => -10587,
        'zhong'  => -10544, 'zhou'  => -10533, 'zhu'   => -10519, 'zhua'  => -10331, 'zhuai' => -10329, 'zhuan'  => -10328,
        'zhuang' => -10322, 'zhui'  => -10315, 'zhun'  => -10309, 'zhuo'  => -10307, 'zi'    => -10296, 'zong'   => -10281,
        'zou'    => -10274, 'zu'    => -10270, 'zuan'  => -10262, 'zui'   => -10260, 'zun'   => -10256, 'zuo'    => -10254,
    );

    /**
     * 将中文编码成拼音
     * @param string $str utf8字符集数据
     * @param string $format 返回格式 [false:首字母|true:全拼音]
     * @return string
     */
    public function encode($str, $all_format = true, $charset = 'utf-8')
    {
        $sGBK = ($charset == 'utf-8') ? iconv('utf-8', 'gbk', $str) : $str;
        $aBuf = array();
        for ($i = 0, $iLoop = strlen($sGBK); $i < $iLoop; $i++) {
            $iChr = ord($sGBK{$i});
            if ($iChr > 160) {
                $iChr = ($iChr << 8) + ord($sGBK{ ++$i}) - 65536;
            }

            if ($all_format) {
                $aBuf[] = $this->zh2py($iChr);
            } else {
                $aBuf[] = substr($this->zh2py($iChr), 0, 1);
            }

        }
        if ($all_format) {
            return implode(' ', $aBuf);
        } else {
            return implode('', $aBuf);
        }

    }

    /**
     * 中文转换到拼音(每次处理一个字符)
     * @param number $iWORD 待处理字符双字节
     * @return string 拼音
     */
    private function zh2py($iWORD)
    {
        if ($iWORD > 0 && $iWORD < 160) {
            return chr($iWORD);
        } elseif ($iWORD < -20319 || $iWORD > -10247) {
            return '';
        } else {
            foreach ($this->_aMaps as $py => $code) {
                if ($code > $iWORD) {
                    break;
                }

                $result = $py;
            }
            return $result;
        }
    }
}
